package com.android.scj.tc;

import android.content.Context;

import com.android.scj.tc.bean.BSTRequest;
import com.android.scj.tc.bean.BSTResponse;
import com.android.scj.tc.bean.CRCSwitchingRequest;
import com.android.scj.tc.bean.CRCSwitchingResponse;
import com.android.scj.tc.bean.FastRequest;
import com.android.scj.tc.bean.FastResponse;
import com.android.scj.tc.bean.InitRequest;
import com.android.scj.tc.bean.InitResponse;
import com.android.scj.tc.bean.PSAMPassRequest;
import com.android.scj.tc.bean.PSAMPassResponse;
import com.android.scj.tc.bean.ReadVersionRequest;
import com.android.scj.tc.bean.ReadVersionResponse;
import com.android.scj.tc.bean.TTransmissionRequest;
import com.android.scj.tc.bean.TTransmissionResponse;
import com.android.scj.tc.bean._PSAMResetRequest;
import com.android.scj.tc.bean._PSAMResetResponse;

/**
 * 串口消息管理类
 * @author LiuYaDong
 *
 */
public class CMD_Manager {

	private static Connection[] con = new Connection[2];
	private static CMD_Manager cmd = null;

	private   Context context;
	private CMD_Manager(Context context){
		con[0] = new Connection();
		con[1] = new Connection();
		this.context=context;
	};

	/**
	 * 获取连接串口对象
	 * @return
	 */
	public static Connection[] getConnection(){
		for (int i = 0; i < con.length; i++) {
			if(con[i] == null){
				con[i] = new Connection();
			}
		}
		return con;
	}
	/**
	 * 获取管理类对象
	 * @return
	 */
	public static CMD_Manager getCMDManager(Context context){
		if(cmd == null)
			cmd = new CMD_Manager(context);
		return cmd;
	}


	/**
	 * 初始化信息
	 * @param flag 00：忽略快速响应 01：完全透传
	 * @param bST_Interval  BST间隔 单位毫秒，范围1-100ms
	 * @param retryInterval 交易重试间隔，单位毫秒，范围1-100ms
	 * @param txPower  功率级数，范围0-31；00：关闭天线，31：最大功率
	 * @param pLLChannelID 信道号，范围00-01
	 * @param crc 00:北京，01：ITS标准
	 * @throws Exception 初始化失败返回错误信息
	 */
	public void init(String flag,String bST_Interval,
					 String retryInterval, String txPower, String pLLChannelID,String crc) throws Exception {
		// 1、初始化快速响应
		FastResponse fr = FastResponse.disassemble(con[0].send(FastRequest.create(flag).getCMDSTR(),context));
		if(fr==null){
			throw new Exception("快速响应初始化失败!");
		}
		if("00".equals(fr.getStatus())){
			System.out.println("快速响应初始化成功!");
		}else{
			throw new Exception("快速响应初始化失败!");
		}
		// 2、初始化配置
		InitResponse ir = InitResponse.disassemble(con[0].send(InitRequest.create(bST_Interval,retryInterval,txPower,pLLChannelID).getCMDSTR(),context));
		if(ir == null){
			throw new Exception("功率信息初始化失败!");
		}
		if("00".equals(ir.getRSUStatus())){
			System.out.println("功率信息初始化成功!");
		}else{
			throw new Exception("功率信息初始化失败!");
		}
		// 3、初始化协议
		CRCSwitchingResponse cr = CRCSwitchingResponse.disassemble(con[0].send(CRCSwitchingRequest.create(crc, "00", "00").getCMDSTR(),context));
		if(cr==null){
			throw new Exception("协议信息初始化失败!");
		}
		if("00".equals(cr.getStatus())){
			System.out.println("协议信息初始化成功!");
		}else{
			throw new Exception("协议信息初始化失败!");
		}
	}
	/**
	 * 发送BST 返回应答
	 * @param bstPrimitive BST原语
	 * @return 返回第一个字节Status 非00表示错误 状态00的话后面的都是数据
	 * @throws Exception 错误信息
	 */
	public String SendBst(String bstPrimitive) throws Exception{
		BSTResponse bst = null;
		try {
			bst =  BSTResponse.disassemble(con[0].send(BSTRequest.create(bstPrimitive).getCMDSTR(),context));
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		if(bst == null){
			return "01";
		}
		return bst.getStatus()+bst.getVST();
	}

	/**
	 * 透明通道发送指令 返回应答
	 * @param confirm  01：需等待OBU应答，00：无需等待应答
	 * @param Primitive 通信原语指令
	 * @return   返回第一个字节Status 非00表示错误 状态00的话后面的都是数据
	 * @throws Exception 错误信息
	 */
	public String SendTransparentCom(String confirm,String Primitive) throws Exception{
		TTransmissionResponse ttr = null;
		try {
			ttr = TTransmissionResponse.disassemble(con[0].send(TTransmissionRequest.create(confirm,Primitive).getCMDSTR(),context));
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		if(ttr == null)
			return "01";
		return ttr.getStatus()+ttr.getHexstr();
	}
	/**
	 * psam检查卡槽是否存在卡片
	 * @param cardPosion 0x00~0x05表示卡槽号
	 * @return 返回第一个字节Status 非00表示错误 状态00的话后面的都是数据
	 * @throws Exception 错误信息
	 */
	public String SendCheckCard(String cardPosion) throws Exception{
		_PSAMResetResponse psamResponse = null;
		try {
			psamResponse = _PSAMResetResponse.disassemble(con[0].send(_PSAMResetRequest.create(cardPosion).getCMDSTR(),context));
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		if(psamResponse == null)
			return "01";
		return psamResponse.getStatus()+psamResponse.getContext();
	}
	/**
	 * 读取版本信息
	 * @return 返回第一个字节Status 非00表示错误 状态00的话后面的都是数据
	 * @throws Exception 错误信息
	 */
	public String SendReadVersion() throws Exception{
		ReadVersionResponse rvr = null;
		try {
			rvr = ReadVersionResponse.disassemble(con[0].send(ReadVersionRequest.create().getCMDSTR(),context));
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		if(rvr == null)
			return "01";
		return rvr.getStatus()+rvr.getEquiptmentMessage();
	}
	/**
	 * PSAM卡片通道指令
	 * @param psamPosion  0x00~0x05表示卡槽号
	 * @param psamCommand 指令个数(1字节)+指令1长度(1字节)+指令1内容(根据长度决定)+指令N长度(1字节)+指令2内容(根据长度决定)
	 * @return 返回第一个字节Status(1字节) + 执行个数(1字节) + 长度+内容
	 * @throws Exception
	 */
	public String SendCardCommand(String psamPosion,String psamCommand) throws Exception{

		PSAMPassResponse psamResponse = null;
		try {
			psamResponse = PSAMPassResponse.disassemble(con[0].send(PSAMPassRequest.create(psamPosion, psamCommand).getCMDSTR(),context));
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		if(psamResponse ==null)
			return "01";
		return psamResponse.getStatus()+psamResponse.getCmdconut()+psamResponse.getContext();
	}
}
